﻿using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;
using Nemerle.Compiler;

using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;

namespace NRails.Console
{
  module MigrationCompiler
  {
      loc[T]() : string
      {
          typeof(T).Assembly.Location
      }

      public Compile(migrationFiles : list[string]) : Assembly
      {
          def options = CompilationOptions();
          def manager = ManagerClass(options);
          
          manager.InitOutput(System.Console.Out);
          
          options.Sources = migrationFiles;
          options.CompileToMemory = true;
          
          options.MacrosToLoad = ["NRails.Macros"];
          options.ReferencedLibraries = [loc.[Engine]()];
          options.LibraryPaths = [@"C:\Program Files\Nemerle", Assembly.GetEntryAssembly().Location];
          
          def thread = System.Threading.Thread(
                       fun(){ manager.Run() },
                       //Указание размера стека для треда напрямую
                       //Необходимо для компилятора, т.к. он падает на значениях размера стека по умолчанию
                       5*System.IntPtr.Size*1024*1024); 
          thread.Start();
          thread.Join();
          
          manager.GeneratedAssembly
      }
  }
}
